/*
 * @Descripttion: 
 * @version: 0.0.0.1
 * @Author: chenyf15482
 * @Date: 2022-12-26 13:26:35
 * @LastEditors: chenyf15482
 * @LastEditTime: 2023-03-08 14:39:03
 */
import { _transKeyTo } from '@/utils/common/transKey'
import { _linkCreate, _cancelLink, requestProp, responseProp } from '../commom/apiLink';
import { _getJcScommonDefault } from '../commom/paramFunc';
import { AxiosError } from 'axios';

// 构建java请求连接
const httpFetch = _linkCreate({
    baseURL: '/api/',
    timeout: 60000,
    // headers: {
    // 请求参数默认下划线结构 返回集默认为驼峰结构
    //     reqFieldKeyType: 'underscore',
    //     respFieldKeyType: 'camel',
    // },
    // 请求参数数据格式化处理
    transformRequest: function(data, headers) {
        // 获取基础信息
        // const jcScommonDefault = _getJcScommonDefault();
        const tmp = {
            // jcScommonDefault,
            ...data
        }
        // console.log(headers)
        // 接口字段处理 根据reqFieldKeyType设置进行字段名风格转换处理
        const result = _transKeyTo(tmp, headers?.reqFieldKeyType as yFieldKeyType);
        // 一般正确的搭配方式为application/json+json.stringfy()；application/x-www-form-urlencoded+qs.stringfy()
        // transformRequest中需要处理
        return JSON.stringify(result);
        // return result;
    },
    // 返回结果集数据格式化处理
    transformResponse: function name(data, headers) {
        const tmp = JSON.parse(data);
        // 接口字段处理 根据reqFieldKeyType设置进行字段名风格转换处理 该设置需要服务接口中返回 前端默认处理为驼峰
        const result = _transKeyTo(tmp, headers?.respFieldKeyType as yFieldKeyType || 'camel');
        return result;
    }
});

// 请求拦截器
const requestFN = (config: requestProp) => {
    // 取消重复请求
    config.headers?.cancelable && _cancelLink(config.url || '');
    config.headers.token = sessionStorage.getItem('token');
    config.headers.user = sessionStorage.getItem('user');
    return config;
};

// reponse拦截器
const reponseFN = (response: responseProp) => {
    // 默认只返回data数据
    return response.data;
};

// reponse错误拦截器
const reponseErrorFN = (error: AxiosError) => {
    const response = error.response;
    // 默认只返回data数据
    if (response) {
        return response.data
    } else {
        return error;
    }
};

// 请求拦截器
httpFetch.interceptors.request.use(requestFN, (err) => Promise.reject(err));
// 响应拦截器
httpFetch.interceptors.response.use(reponseFN, reponseErrorFN);

export default httpFetch;
